package com.itqf.controller;

import com.itqf.entity.User;
import com.itqf.service.UserService;
import com.itqf.service.impl.UserServiceImpl;
import com.itqf.utils.Base64Utils;
import com.itqf.utils.Constants;
import com.itqf.utils.MD5Utils;
import com.itqf.utils.RandomUtils;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Map;

@WebServlet(name = "UserController", value = "/user")
public class UserController extends BaseServlet {
    private static UserService userService = new UserServiceImpl();

    /**
     * 检测用户名是否存在
     *
     * @param request
     * @param response
     * @return 1用户名存在 0用户名不存在
     * @throws SQLException
     */
    public String check(HttpServletRequest request, HttpServletResponse response) throws SQLException {
        System.out.println("进行用户名检测！！！");
        //1.获取用户名
        String username = request.getParameter("username");
        if (username == null) {
            return Constants.HAS_USER; //不能注册
        }
        //2.调用业务逻辑判断用户名是否存在
        boolean b = userService.checkedUser(username);
        //3.响应字符串  1 存在  0 不存在
        if (b) {
            //用户存在
            return Constants.HAS_USER;
        }
        return Constants.NOT_HAS_USER;
    }

    /**
     * 注册方法
     *
     * @param request
     * @param response
     * @return 注册成功跳转至注册成功页面   注册失败则重新注册
     */
    public String register(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("进行用户注册！！！");
        //1.获取用户信息
        Map<String, String[]> parameterMap = request.getParameterMap();
        User user = new User();
        //map集合中的key为User类对象
        //调用BeanUtils.populate()方法将map中的key映射到新建的User对象上
        try {
            BeanUtils.populate(user, parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //2.完善用户信息
        //已经赋值的：用户名，密码，邮箱，性别
        //没有赋值的：用户的激活状态、账号类型、邮件激活码
        user.setUstatus("0");//激活状态：0未激活 1已激活
        user.setUrole(0);//普通用户0 管理员1
        user.setCode(RandomUtils.createActive());//调用工具类随机生成激活码

        //需要处理的属性：密码（md5进行加密）
        user.setUpassword(MD5Utils.md5(user.getUpassword()));

        //3.调用用户模块的业务逻辑进行注册
        try {
            userService.registerUser(user);
        } catch (SQLException e) {
            //注册失败，重新注册
            e.printStackTrace();
            request.getSession().setAttribute("registerMsg", "注册失败");
            return Constants.FORWARD + "register.jsp";
        }

        //4.响应(注册成功，跳转至注册成功页面)
        return Constants.FORWARD + "registerSuccess.jsp";
    }

    /**
     * 邮件激活码激活
     *
     * @param request
     * @param response
     * @return
     */
    public String active(HttpServletRequest request, HttpServletResponse response) throws SQLException {
        //1.获取激活码
        String c = request.getParameter("c");

        //2.将base64反转
        String code = Base64Utils.decode(c);

        //3.调用业务逻辑，进行激活业务
        int i = userService.activeUser(code);

        //4.响应(激活失败（code没有找到） 已经激活  激活成功)
        if (i == Constants.ACTIVE_FAIL) {
            request.setAttribute("msg", "未激活成功！！！");
        } else if (i == Constants.ACTIVE_SUCCESS) {
            request.setAttribute("msg", "激活成功,请登录！！！");
        } else {
            request.setAttribute("msg", "已经激活！！！");
        }
        //转发
        return Constants.FORWARD + "/message.jsp";
    }


    /**
     * 1.前端提交账号密码和验证码
     * 2.对比验证码 成功 ---》 对比账号密码
     * 3.对比账号密码
     * 失败： --》 回到登录页面 进行提示
     * 成功： --》 未激活  登录页面 进行提示
     * --》 已激活  程序的首页  将用户放入session共享域
     */

    public String login(HttpServletRequest request, HttpServletResponse response) throws SQLException {


        //1.获取请求参数（用户名，密码，验证码）
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String code = request.getParameter("code");//用户输入的验证码
        String auto = request.getParameter("auto"); //自动登录标识

        //正确的验证码
        HttpSession session = request.getSession();
        String codestr = (String) session.getAttribute("code");

        //2.判断验证码是否正确

        if (code == null || !code.equalsIgnoreCase(codestr)) {
            request.setAttribute("msg", "验证码错误");
            return Constants.FORWARD + "/login.jsp";
        }
        //3.调用业务逻辑判断账号密码

        User user = userService.loginUser(username, password);

        //4.响应
        //user 等于null证明账号或者密码错误
        //user 不为null 但是user的状态是未激活状态

        if (user == null) {
            request.setAttribute("msg", "账号或者密码错误");
            return Constants.FORWARD + "/login.jsp";
        }

        if (user.getUstatus().equals(Constants.USER_NOT_ACTIVE)) {
            request.setAttribute("msg", "账号未激活！");
            return Constants.FORWARD + "/login.jsp";
        }
        session.setAttribute("loginUser", user);

        //判断是否做了自动登录
        if (auto == null) {
            //没有勾选
            //将本地浏览器存储的cookie清空
            Cookie cookie = new Cookie(Constants.AUTO_NAME, "");
            cookie.setPath("/");//web项目下的所有资源都可以访问
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        } else {
            //自定登录数据存储 2周
            String content = username + Constants.FLAG + password;//将账号密码拼接存储
            //用Base64进行加密
            content = Base64Utils.encode(content);
            Cookie cookie = new Cookie(Constants.AUTO_NAME, content);
            cookie.setPath("/");//web项目下的所有资源都可以访问
            cookie.setMaxAge(14 * 24 * 60 * 60);
            response.addCookie(cookie);
        }
        return Constants.REDIRECT + "/index.jsp";
    }

    public String logOut(HttpServletRequest request , HttpServletResponse response){
        //1.清空session中的用户数据
        HttpSession session = request.getSession();
        session.removeAttribute("loginUser");
        //2.清空和覆盖cookie中的自动登录信息
        Cookie cookie = new Cookie(Constants.AUTO_NAME,"");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        //3.注销成功，重定向至登录页面
        request.setAttribute("msg","注销成功！！！");
        return Constants.FORWARD+"/login.jsp";

    }
}
